package com.github.zyf.ioaj.algorithm;

import com.github.zyf.ioaj.constant.ParamType;
import com.github.zyf.ioaj.annotation.internal.Param;
import com.github.zyf.ioaj.annotation.internal.ParamItem;

import java.util.Arrays;

/**
 * <h1>算法输出量</h1>
 * <p>
 * 算法输出量包括
 * <ul>
 *     <li>最优值：{@link #optimalOutput}，通过{@link #getOptimalOutput()}获取</li>
 *     <li>最优值对应的自变量取值：{@link #optimalInput}，通过{@link #getOptimalInput()}获取</li>
 * </ul>
 * <p>以最小值为例，比如：y=x^2，自变量取值是-3~3，那么最优值是0，最优值对应的自变量取值是0</p>
 * <p>
 * 此外，该类实现了{@link #toString()}方法，如需转字符串（该方法一般用于程序调试输出，无换行），可以使用该方法，如有特殊需求：
 * <ul>
 *     <li>中文文本（有换行）：{@link #toTxt()}</li>
 *     <li>Json字符串（英文，无换行）：{@link #toJson()}</li>
 * </ul>
 *
 * @author zyf
 */
@Param
public class Output {

    /**
     * <p>最优值</p>
     */
    @ParamItem(type = ParamType.DOUBLE, desc = "最优值")
    private double optimalOutput;
    /**
     * <p>最优值对应的变量取值</p>
     */
    @ParamItem(type = ParamType.DOUBLE_ARRAY_1, desc = "最优值对应的变量取值")
    private double[] optimalInput;

    /**
     * <p>构建输出量</p>
     *
     * @param optimalOutput 最优值
     * @param optimalInput  最优值对应的变量取值
     */
    public Output(double optimalOutput, double[] optimalInput) {
        this.optimalOutput = optimalOutput;
        this.optimalInput = optimalInput;
    }

    public double getOptimalOutput() {
        return optimalOutput;
    }

    public void setOptimalOutput(double optimalOutput) {
        this.optimalOutput = optimalOutput;
    }

    public double[] getOptimalInput() {
        return optimalInput;
    }

    public void setOptimalInput(double[] optimalInput) {
        this.optimalInput = optimalInput;
    }

    @Override
    public String toString() {
        return "Output{" +
                "optimalOutput=" + optimalOutput +
                ", optimalInput=" + Arrays.toString(optimalInput) +
                "}";
    }

    public String toTxt() {
        return "\n---\n算法输出结果如下：" +
                "\n最优值：" + optimalOutput +
                "\n最优值对应的自变量取值：" + Arrays.toString(optimalInput) + "\n---";
    }

    public String toJson() {
        return "\"output\": {" +
                "\"optimalOutput\": " + optimalOutput +
                ", \"optimalInput\": " + Arrays.toString(optimalInput) +
                "}";
    }
}
